;################################
;#				#
;# INITIALISATION		#
;#				#
;################################
;
numInst="I"
;
;
;
;
;
;
;################################
;#				#
;# TMOS				#
;#				#
;################################
;
procedure(tmos(nbrDrain nbrRangee xorg yorg)
	let((x y heureDebut heureFin duree nbrCells
	position ySense yMaxTmos xmax ymax xD yD)
	heureDebut=getCurrentTime()
	if(nbrDrain<2 then
		hiDisplayAppDBox( 
				?name 		'erreurDrain
				?dboxBanner 	"PARAMETRES ERRONES"
				?dboxText	"Le nombre de DRAINS doit etre superieur ou egal a 2"
				?dialogType	hicWarningDialog
				?callback	"hiSetAbort()"
				?dialogStyle	'modal      ;;; 'modal 'modeless 'systemModal
		)	
	) ; if
	if(nbrRangee<3 then
		hiDisplayAppDBox( 
				?name 		'erreurRangee
				?dboxBanner 	"PARAMETRES ERRONES"
				?dboxText	"Le nombre de RANGEES doit etre superieur ou egal a 3"
				?dialogType	hicWarningDialog
				?callback	"hiSetAbort()"
				?dialogStyle	'modal      ;;; 'modal 'modeless 'systemModal
		)
	) ; if	
;************************** CRATION BASE TMOS *******************************
	x=xorg
	y=yorg
	cv=geGetWindowCellView()
	nameInst=strcat("" gensym(numInst))
	dbCreateInst(cv dbOpenCellView("guy" "g" "layout") nameInst list(x y) "R0" 1 )
	x=x+288
	nameInst=strcat("" gensym(numInst))
	dbCreateSimpleMosaic(cv dbOpenCellView("guy" "h" "layout") nameInst list(x y) "R0" 1 nbrDrain-1 0 480)
	x=x+((nbrDrain-1)*480)
	nameInst=strcat("" gensym(numInst))
	dbCreateInst(cv dbOpenCellView("guy" "i" "layout") nameInst list(x y) "R0" 1 )
;	
	x=xorg
	y=y+36
	nameInst=strcat("" gensym(numInst))
	dbCreateSimpleMosaic(cv dbOpenCellView("guy" "d" "layout") nameInst list(x y) "R0" nbrRangee-2 1 32 0)
	x=x+288
	nameInst=strcat("" gensym(numInst))
	dbCreateSimpleMosaic(cv dbOpenCellView("guy" "e" "layout") nameInst list(x y) "R0" nbrRangee-2 nbrDrain-1 32 480)
	x=x+((nbrDrain-1)*480)
	nameInst=strcat("" gensym(numInst))
	dbCreateSimpleMosaic(cv dbOpenCellView("guy" "f" "layout") nameInst list(x y) "R0" nbrRangee-2 1 32 0)
;	
	x=xorg
	y=yorg+((nbrRangee-2)*32)+36
	yMaxTmos=y
	nameInst=strcat("" gensym(numInst))
	dbCreateInst(cv dbOpenCellView("guy" "a" "layout") nameInst list(x y) "R0" 1 )
	x=x+288
	nameInst=strcat("" gensym(numInst))
	dbCreateSimpleMosaic(cv dbOpenCellView("guy" "b" "layout") nameInst list(x y) "R0" 1 nbrDrain-1 0 480)
	x=x+((nbrDrain-1)*480)
	nameInst=strcat("" gensym(numInst))
	dbCreateInst(cv dbOpenCellView("guy" "c" "layout") nameInst list(x y) "R0" 1 )
;
	xmax=x+200
	ymax=y+36
	dbCreateRect(cv "epi" list(xorg-30:yorg-30 xmax+30:ymax+30))
	dbCreateRect(cv "bl" list(xorg+7:yorg+7 xmax-7:ymax-7))
	dbCreatePolygon(cv "iso" list(xorg-44:yorg-30 xorg-44:yorg-44
				      xmax+44:yorg-44 xmax+44:ymax+44
				      xorg-44:ymax+44 xorg-44:yorg-30
				      xorg-30:yorg-30 xorg-30:ymax+30
				      xmax+30:ymax+30 xmax+30:yorg-30
				      xorg-44:yorg-30
				      ))			
;
	flatMosaic(cv)
;************************** CRATION SENSE TMOS ******************************
	position=enterPoint( ?prompts list("Cliquez la localisation du sense"))		
	sense(position "sens_cent")	
	sense(list(xCoord(position) yCoord(position)-32) "sens_centb")	
	ySense=yCoord(position)+32
	sense(list(xCoord(position) ySense) "sens_centl")
	ySense=ySense+32	
	while(ySense<yMaxTmos
		sense(list(xCoord(position) ySense) "sens_centt")
		ySense=ySense+32
	) ;while
	sense(list(xCoord(position) ySense) "sens_centh")		
;************************** CRATION METALISATION ******************************
	stepMet2dlm=round((nbrRangee-1)/7.0)
	xD=xorg+244
	yD=yorg+4
	for(i 1 nbrDrain
		metal2Drain(xD yD stepMet2dlm)
		xD=xD+480
	) ; for
		
;***************************************************************************
;
;		PROCEDURE POUR FLATTER LES CELLS ( a b c ...)
;
;	foreach(instance cv~>instances
;		leFlattenInst(instance 1 nil nil)
;	) ; foreach
;***************************************************************************
	
	heureFin=getCurrentTime()
	duree=compareTime(heureFin heureDebut)
	nbrCells=(nbrDrain*12)*nbrRangee
	printf("Le temps de construction du TMOS de %L Cells a ete de %L secondes" nbrCells duree)
	) ;let
) ;procedure
;
;
;
;
;
;
;################################
;#				#
;# FLATMOSAIC			#
;#				#
;################################
;
procedure(flatMosaic(windbid)
	let((listMosaic nbrMosaic i)
		listMosaic=windbid~>mosaics
		nbrMosaic=length(listMosaic)
		for(i 0 nbrMosaic-1
			leFlattenInst(nth(i listMosaic) 1 nil nil)
		) ; for
	) ; let
) ; proc	
;
;
;
;
;
;
;################################
;#				#
;# SENSE			#
;#				#
;################################
;
procedure(sense(coordonnees cellule)
	let((dbidSense coordSense numInst)
	numInst="S"
	dbidSense=gePointQuery(geGetCellViewWindow(geGetWindowCellView()) coordonnees "filter")
	coordSense=car(dbidSense~>bBox)
	dbDeleteObject(dbidSense)
	nameInst=strcat("" gensym(numInst))
	dbCreateInst(cv dbOpenCellView("guy" cellule "layout") nameInst coordSense "R0" 1 )
	) ; let
) ; proc
;
;
;
;
;
;
;################################
;#				#
;# METAL2DRAIN			#
;#				#
;################################
;
procedure(metal2Drain(xCentreDrain yCentreDrain increment)
	let((xcd ycd hauteur)
	xcd=xCentreDrain
	ycd=yCentreDrain
	hauteur=increment*32
	dbCreatePolygon(cv "met2dlm" list(  xcd-240:ycd-4 		xcd-240:ycd+hauteur
				      	    xcd-176:ycd+hauteur 	xcd-176:ycd+hauteur*2
				      	    xcd-144:ycd+hauteur*2	xcd-144:ycd+hauteur*3
				      	    xcd-112:ycd+hauteur*3 	xcd-112:ycd+hauteur*4
				     	    xcd-80:ycd+hauteur*4	xcd-80:ycd+hauteur*5
				     	    xcd-48:ycd+hauteur*5	xcd-48:ycd+hauteur*6
				     	    xcd+48:ycd+hauteur*6	xcd+48:ycd+hauteur*5				    	    
				     	    xcd+80:ycd+hauteur*5 	xcd+80:ycd+hauteur*4
				     	    xcd+112:ycd+hauteur*4	xcd+112:ycd+hauteur*3
				     	    xcd+144:ycd+hauteur*3 	xcd+144:ycd+hauteur*2
				     	    xcd+176:ycd+hauteur*2 	xcd+176:ycd+hauteur	   
				     	    xcd+240:ycd+hauteur		xcd+240:ycd-4				     	    
				     	    xcd-240:ycd-4		xcd-240:ycd+hauteur
				      ))			
	) ; let
) ; proc
;
;
;
;
;
;
;
;################################
;#				#
;# FILTER			#
;#				#
;################################
;
procedure(filter(a)
	type=a~>cellName
	if(a~>objType=="inst" then
		if(type=="a" || type=="b" || type=="c" ||
	      	   type=="d" || type=="e" || type=="f" ||
	      	   type=="g" || type=="h" || type=="i"
	      	then
	      	a
		) ;if
	) ;if
) ;procedure
;
;
;dbCreatePolygon(cv "met2dlm" list(xcd-240:ycd-4 		xcd-240:ycd+hauteur
;				      	    xcd-208:ycd+hauteur 	xcd-208:ycd+hauteur*2
;				      	    xcd-176:ycd+hauteur*2 	xcd-176:ycd+hauteur*3
;				      	    xcd-144:ycd+hauteur*3	xcd-144:ycd+hauteur*4
;				      	    xcd-112:ycd+hauteur*4 	xcd-112:ycd+hauteur*5
;				     	    xcd-80:ycd+hauteur*5 	xcd-80:ycd+hauteur*6
;				     	    
;				     	    xcd+80:ycd+hauteur*6 	xcd+80:ycd+hauteur*5
;				     	    xcd+112:ycd+hauteur*5 	xcd+112:ycd+hauteur*4
;				     	    xcd+144:ycd+hauteur*4 	xcd+144:ycd+hauteur*3
;				     	    xcd+176:ycd+hauteur*3 	xcd+176:ycd+hauteur*2
;				     	    xcd+208:ycd+hauteur*2 	xcd+208:ycd+hauteur
;				     	    xcd+240:ycd+hauteur 	xcd+240:ycd-4
;				     	    
;				     	    xcd-240:ycd-4		xcd-240:ycd+hauteur
;				      ))			
;
;
;
